// wifi_prov_config.h
#ifndef WIFI_PROV_CONFIG_H
#define WIFI_PROV_CONFIG_H

#include "system/includes.h"

#ifdef __cplusplus
extern "C" {
#endif

// =============== 配网状态定义 ===============
typedef enum {
    WIFI_PROV_STATE_IDLE = 0,           // 空闲状态
    WIFI_PROV_STATE_INIT,               // 初始化状态
    WIFI_PROV_STATE_AP_STARTING,        // AP启动中
    WIFI_PROV_STATE_AP_READY,           // AP就绪，等待配网
    WIFI_PROV_STATE_CREDENTIALS_RECEIVED, // 收到配网信息
    WIFI_PROV_STATE_CONNECTING,         // 连接中
    WIFI_PROV_STATE_CONNECTED,          // 连接成功
    WIFI_PROV_STATE_FAILED,             // 配网失败
    WIFI_PROV_STATE_TIMEOUT,            // 配网超时
    WIFI_PROV_STATE_FACTORY_RESET       // 恢复出厂
} wifi_prov_state_t;

// 配网事件
typedef enum {
    WIFI_PROV_EVENT_INIT,
    WIFI_PROV_EVENT_AP_STARTED,
    WIFI_PROV_EVENT_AP_STOPPED,
    WIFI_PROV_EVENT_CREDENTIALS,
    WIFI_PROV_EVENT_CONNECT_SUCCESS,
    WIFI_PROV_EVENT_CONNECT_FAILED,
    WIFI_PROV_EVENT_TIMEOUT,
    WIFI_PROV_EVENT_FACTORY_RESET,
    WIFI_PROV_EVENT_USER_ABORT
} wifi_prov_event_t;

// 配网错误类型
typedef enum {
    WIFI_PROV_ERR_NONE = 0,
    WIFI_PROV_ERR_INVALID_PARAM,
    WIFI_PROV_ERR_AP_START_FAILED,
    WIFI_PROV_ERR_CREDENTIALS_INVALID,
    WIFI_PROV_ERR_CONNECT_FAILED,
    WIFI_PROV_ERR_TIMEOUT,
    WIFI_PROV_ERR_NETWORK_ERROR,
    WIFI_PROV_ERR_STORAGE_ERROR,
    WIFI_PROV_ERR_SERVER_ERROR
} wifi_prov_error_t;

// 超时类型
typedef enum {
    WIFI_PROV_TIMEOUT_AP_START,
    WIFI_PROV_TIMEOUT_WAIT_CREDENTIALS,
    WIFI_PROV_TIMEOUT_CONNECT,
    WIFI_PROV_TIMEOUT_VERIFY
} wifi_prov_timeout_type_t;

// 错误恢复策略
typedef enum {
    WIFI_PROV_RECOVERY_NONE,        // 不恢复
    WIFI_PROV_RECOVERY_RETRY,       // 重试
    WIFI_PROV_RECOVERY_FALLBACK,    // 回退到AP模式
    WIFI_PROV_RECOVERY_FACTORY_RESET // 恢复出厂
} wifi_prov_recovery_t;

// =============== 配置结构定义 ===============

// 超时配置
typedef struct {
    u32 ap_start_timeout_ms;        // AP启动超时 (10秒)
    u32 wait_credentials_timeout_ms; // 等待配网超时 (5分钟)
    u32 connect_timeout_ms;         // 连接超时 (30秒)
    u32 verify_timeout_ms;          // 连接验证超时 (10秒)
    u8 max_connect_retry;           // 最大重试次数 (3次)
    u32 retry_delay_ms;             // 重试间隔 (5秒)
} wifi_prov_timeout_config_t;

// 配网配置
typedef struct {
    // AP配置
    char ap_ssid_prefix[32];
    char ap_password[64];
    u8 ap_channel;
    u32 ap_ip;
    u32 ap_netmask;
    u32 ap_gateway;
    
    // 配网服务器配置
    u16 http_port;
    u8 enable_captive_portal;
    u32 captive_portal_ip;
    
    // 超时配置
    wifi_prov_timeout_config_t timeouts;
    
    // 重试配置
    u8 max_retry_count;
    u32 retry_delay_ms;
    
    // 功能开关
    u8 auto_start;
    u8 enable_scan;
    u8 enable_verification;
} wifi_prov_config_t;

// 用户回调接口
typedef struct {
    // 状态变化回调
    void (*on_state_changed)(wifi_prov_state_t old_state, wifi_prov_state_t new_state);
    
    // 进度更新回调
    void (*on_progress)(int progress);
    
    // 错误回调
    void (*on_error)(wifi_prov_error_t error, const char* message);
    
    // 成功回调
    void (*on_success)(const char* ssid);
    
    // 超时回调
    void (*on_timeout)(wifi_prov_timeout_type_t timeout_type);
} wifi_prov_callbacks_t;

// 事件桥接接口 (配网管理模块 ↔ wifi_app_task)
typedef struct {
    // 配网管理模块 → wifi_app_task 的事件
    void (*on_prov_start_ap)(void);           // 请求启动AP
    void (*on_prov_stop_ap)(void);            // 请求停止AP
    void (*on_prov_connect_sta)(const char* ssid, const char* pwd); // 请求连接STA
    void (*on_prov_set_mode)(int mode);       // 请求设置模式
    
    // wifi_app_task → 配网管理模块 的事件
    void (*on_wifi_ap_started)(void);         // AP已启动
    void (*on_wifi_ap_stopped)(void);         // AP已停止
    void (*on_wifi_sta_connected)(void);      // STA已连接
    void (*on_wifi_sta_disconnected)(void);   // STA已断开
    void (*on_wifi_error)(int error);         // WiFi错误
} wifi_prov_event_bridge_t;

// =============== 默认配置 ===============
#define WIFI_PROV_DEFAULT_TIMEOUT_CONFIG() { \
    .ap_start_timeout_ms = 10000, \
    .wait_credentials_timeout_ms = 300000, \
    .connect_timeout_ms = 30000, \
    .verify_timeout_ms = 10000, \
    .max_connect_retry = 3, \
    .retry_delay_ms = 5000 \
}

#define WIFI_PROV_DEFAULT_CONFIG() { \
    .ap_ssid_prefix = "AIBOT_", \
    .ap_password = "", \
    .ap_channel = 6, \
    .ap_ip = 0xC0A80101, \
    .ap_netmask = 0xFFFFFF00, \
    .ap_gateway = 0xC0A80101, \
    .http_port = 80, \
    .enable_captive_portal = 1, \
    .captive_portal_ip = 0xC0A80101, \
    .timeouts = WIFI_PROV_DEFAULT_TIMEOUT_CONFIG(), \
    .max_retry_count = 3, \
    .retry_delay_ms = 5000, \
    .auto_start = 1, \
    .enable_scan = 1, \
    .enable_verification = 1 \
}

// =============== 公共API ===============

// 初始化配网模块
int wifi_prov_init(const wifi_prov_config_t* config);

// 启动配网
int wifi_prov_start(void);

// 停止配网
int wifi_prov_stop(void);

// 获取状态
wifi_prov_state_t wifi_prov_get_state(void);

// 获取进度 (0-100)
int wifi_prov_get_progress(void);

// 获取错误信息
wifi_prov_error_t wifi_prov_get_error(void);
const char* wifi_prov_get_error_string(wifi_prov_error_t error);

// 恢复出厂设置
int wifi_prov_factory_reset(void);

// 设置回调
int wifi_prov_set_callbacks(const wifi_prov_callbacks_t* callbacks);

// 设置事件桥接
int wifi_prov_set_event_bridge(const wifi_prov_event_bridge_t* bridge);

// 获取当前连接的SSID
const char* wifi_prov_get_connected_ssid(void);

// 检查是否需要配网
int wifi_prov_need_provisioning(void);

// 获取配网模式
wifi_prov_desired_mode_t wifi_prov_get_desired_mode(void);

// 事件处理 (由wifi_app_task调用)
int wifi_prov_on_wifi_event(enum WIFI_EVENT event, void* arg);

// 凭据处理 (由配网服务器调用)
int wifi_prov_on_credentials(const char* ssid, const char* pwd, int save);

#ifdef __cplusplus
}
#endif

#endif // WIFI_PROV_CONFIG_H
